Non-volatile data storage devices, such as embedded memory devices (e.g., embedded MultiMedia Card (eMMC) devices) and removable memory devices (e.g., removable universal serial bus (USB) flash memory devices and other removable storage cards), have allowed for increased portability of data and software applications. Users of non-volatile data storage devices increasingly rely on the non-volatile storage devices to store and provide rapid access to a large amount of data. For example, a user may store large audio files, images, videos, and other files at a data storage device.
Read voltages for reading a flash memory of a non-volatile data storage device are not the same for all of the blocks of the flash memory. Due to aging and cycling, the reading voltages tend to change over time, such that a first set of read voltages (e.g., a first tag) for reading a first block which is recently programmed may differ from a second set of read voltages (e.g., a second tag) for a second block which was programmed a long time before the first block. The non-volatile data storage device may store different read voltages that are determined for different blocks. However, a number of sets of read voltages (e.g., a number of tags) that the non-volatile data storage device stores may be a predefined number.
During operation of the non-volatile data storage device, sets of read voltages may be generated (e.g., using a direct cell voltage distribution (CVD) calculation) and stored until the predefined number is reached. After the predetermined number of sets of read voltages is reached, blocks that may be opened are then associated with the last set of read voltages (e.g., corresponding to the “last” block) that was generated. This may result in a situation where a particular set of read voltages is associated with multiple blocks where some of the blocks should be associated with a different set of read voltages.
During a read operation, a particular block which is associated with the last set of read voltages may fail decoding, may have a large bit error rate (BER) value, may require multiple decoding attempts before the particular block is decoded successfully, or may require decoding with multiple soft bits (e.g., two soft bits). Such an event may trigger a direct CVD calculation and, as a result, a “new” set of read voltages for the failing block may be computed and may be saved by replacing (e.g., overwriting) the last set of read voltages. The “new” set of read voltages may be usable for the particular block that failed but other blocks (e.g., “older” blocks) which are associated with the last set of read voltages may still be readable with the last set of read voltages, but may fail or have difficulties with the new set of read voltages. If a read operation is performed on one of the other blocks (e.g., the “older” blocks), a direct CVD calculation may be triggered again, and a “brand new” set of read voltages is computed. The “brand new” set of read voltages may replace the “new” set of read voltages. This process of triggering direct CVD computations and updating the set of read voltages may be repeated multiple times. Each computation of the direct CVD calculation requires resources and causes a delay (e.g., a few milliseconds) which may cause degradation in system performance of the non-volatile data storage device.